『Out of the Tar Pit』
複雑さについて書かれた論文
ソフトウェアは本質的に複雑だが、複雑さの種類があり、コントロールできる
2006/2/6
PDF
66ページある
/mrsekut-book-outoftarpit
著者
Ben Moseley
Peter Marks
参考
システムの複雑さはどこから来るのか – Out of the tar pitを読む - Uzabase for Engineers
解説
↓をわざわざ読んだけど、↑この記事でかなり十分、というきもちになったmrsekut.icon
要点としては
まず、Complexityと呼んでいるものが、大きく分けて2つに分類できるということを意識すること
Essential ComplexityとAccidental Complexity
そして、出来る限りAccidental Complexityを排除すること
そして、残ったComplexity (Essentialと一部のAccidental)の依存関係を調整すること
Abstract
Brooksは、現代のComplexityの殆どがシステムの本質である、と前提しているが、それを批判する
1 Introduction
/mrsekut-book-outoftarpit/00 (1 Introduction)
システムのComplexityの主な要因
状態
コード量
flow of control
OOPもFPも異なるアプローチをしてるが、各々様々な問題がある
OOP, FP, RDBのアイディアを組み合わせる
2 Complexity
複雑さ一般について
/mrsekut-book-outoftarpit/01 (2 Complexity)
『No Silber Bullet』での4つの困難
Compexity
Comformity
?mrsekut.icon
Changeability
Invisibility
?mrsekut.icon
あんまり何も言ってない
3 Approaches to Understanding
/mrsekut-book-outoftarpit/03 (3 Approaches to Understanding)
システムを理解するためのアプローチは2つある
Testing
システムをブラックボックスと捉え、外部から理解する
ある特定の状況でのシステムの振る舞いの結果を確認する
テストに依って達成できることには本質的な限界がある
特定のパターンしか見れないし
より多くのエラーを検出できる
Informal Reasoning
内部からシステムを調査し理解する
エラーの発生を減らすことができる
こちらの方が重要
具体的にどういう操作のこと?mrsekut.icon
「Informal」なので形式的なものではなく、経験や直観によるシステムの内部分析
ER図等を用いてアーキテクチャを理解する、みたいな感じだろうか
いずれにせよ、両方を併用しても限界があるのでシンプルにすべし、といった結論
4 Causes of Complexity
/mrsekut-book-outoftarpit/04 (4 Causes of Complexity)
状態が引き起こす複雑さ
/mrsekut-book-outoftarpit/05 (4.1 Complexity caused by State)
外部から見ても、内部から見ても辛い
前者はテストがつらいこと、後者は可読性が悪いことを言ってる
Controlが引き起こす複雑さ
/mrsekut-book-outoftarpit/07 (4.2 Complexity caused by Control)
順序は重要だが、常に必要なわけでもない
↓このようなコードがあるとき、各行は直交してるので並行に実行されても良い
しかし、このコードを読んだ人は、上から順に実行されることを期待する
code:_
a := b + 3
c := d + 2
e := f + 4
暗黙的に順序を強制される
Ozは並行に実行されるらしい
コード量が引き起こす複雑さ
/mrsekut-book-outoftarpit/09 (4.3 Complexity caused by Code Volume)
他の原因と比べて測定しやすい
他の原因と相互作用が大きい
その他
/mrsekut-book-outoftarpit/10 (4.4 Other caused of complexity)
状態を許可するような言語を使う場合は常にそれに気を配る必要がある
JSだとthrowされる可能性を常に気を配る必要がある感じかmrsekut.icon
5 Classical approasches to managing complexity
/mrsekut-book-outoftarpit/11 (5 Classical approaches to managing complexity)
imperative, funcitona, logicでのアプローチ
OOP
状態
OOPのすべての形式は状態に依存しているので、状態に関する問題に悩まされる
複雑さを回避するための適切な基盤を提供できない
FP
状態
状態を完全に排除する言語だと、上述した複雑さの一つを完全に排除できる
Control
暗黙的な順序はあるものの、抽象的な制御を提供してるのでマシ
純粋関数はすべての引数を並列に評価できる
関数の引数を見るだけで制御されるものが分かる
Logical Programming
Prologとかの話
具体例を知らないので全然わからんねmrsekut.icon
↑この辺は別に読まなくても良い感じだった
↓この辺からがおもしろポイント
6 Accidents and Essence
/mrsekut-book-outoftarpit/20 (6 Accidents and Essence)
Accidental ComplexityとEssential Complexityについて
Brooksが「現代のComplexityの殆どがシステムの本質である」と前提していることに対する批判と深掘りをしている
Brooksを採用すると「複雑なんだ、しゃあないね」となってしまう
そうではなく、更にComplexityを大きく2つに分類した
Accidental Complexityはなくてもシステムを実現できる
したがって、こちら側をきる限り排除することでComplexityを小さくできる
7 Recommended General Approach
/mrsekut-book-outoftarpit/22 (7 Recommended General Approach)
理想世界を考えて何がEssentialなのかを分析していく
理想世界には形式化すらない
コンピュータで動かすために最終的に形式が必要になるが、その過程で複雑さが増えないようなものであって欲しい
言語の筋の良さにめちゃくちゃ依存するということだろうmrsekut.icon
理想のインフラストラクチャで実行されることを想定する
目的だけを記述する宣言的プログラミング的になる
It is interesting to note that effectively what we have just described is in fact the very essence of declarative programming - i.e. that you need only specify what you require, not how it must be achieved.
/mrsekut-book-outoftarpit/23 (7.1.1 State in the ideal world)
理想世界で、その状態が必要なのかどうかを考えて分類する
table:Data and State
Data Essentiality Data Type Data Mutability Classification
Essential Input - Essential State
Essential Derived Immutable Accidental State
Essential Derived Mutable Accidental State
Accidental Derived - Accidental State
左のカラムのData Essentialityの判断は、
informal requirementsに含まれるかどうかで判断しているmrsekut.icon
例えば、ユーザが直接入力するデータはessentialだし、
キャッシュなど要件に含まれないものはAccidental
とにかく、Derivedして作られる状態はAccidental State
Jotaiとかでプログラミングしてると具体例として「あー、あれのことか」というのがイメージしやすいなmrsekut.icon
曰く、典型的なプログラムには多くのAccidental Stateが含まれており、それによって無駄に複雑化している
/mrsekut-book-outoftarpit/26 (7.1.2 Control in the ideal world)
ControlはすべてAccidentalである
理想世界では全て0秒で完了する
並行処理が必要とかそういうのはinformal requirementsにも出てこないし
/mrsekut-book-outoftarpit/29 (7.2.2 Ease of Expression)
確かにAccidentalなものは省略可能だが、そうすると表現が複雑になってしまうこともある
例えば、ユーザの位置は、初期開始位置とその後の動きから計算できるが、毎度それで計算するのもなあ、という感じ
パフォーマンスの問題もある
/mrsekut-book-outoftarpit/30 (7.3 Recommendation)
複雑さを処理するための推奨事項
避ける
分ける
table:Types of complexity within a system
Complexity Type Recommendation
Essential Logic Separate
Essential Complexity State Spearate
Accidental Useful Complexity State/Control Separate
Accidental Useful Complexity State/Control Avoid
宣言的に書くのがEssentialで、実際の手続きはAccidentalなので、そこも分離すべき、というのは面白いmrsekut.icon
8 The Relational Model
/mrsekut-book-outoftarpit/36 (8 The Relational Model)
relational modelについて
9 Funcitional Relational Programming
FRP
10 Example of an FRP system
11 Related Work
#スクボ読書化した本